package com.generalbackend.common.util;

import cn.hutool.core.util.ArrayUtil;
import com.generalbackend.common.exception.EToolsRuntimeException;

/**
 * 用于校验上传和下载的文件是否合法
 * @author tim.xie
 * @date 2022/1/21 14:34
 */
public class CheckFileUtil {

    /**
     * 可上传的合法文件类型
     */
    private static String[] uploadRightTypes = "pdf,jpg,png,jpeg,gif,doc,mp4,mp3,wmv,wav,avi,rar,docx,xlsx,xls,csv,zip,txt,md".split(",");
    /**
     * 可下载的合法文件类型
     */
    private static String[] downloadRightTypes = "pdf,jpg,png,jpeg,gif,doc,mp4,mp3,wmv,wav,avi,rar,docx,xlsx,xls,csv,zip,txt,md".split(",");

    /**
     * 校验上传文件名是否合法,合法类型系统默认
     * @param fileName
     *      文件名
     * @return
     */
    public static boolean checkUploadRightTypes(String fileName) {
        return checkRightTypes(fileName, uploadRightTypes);
    }

    /**
     * 校验上传文件名是否合法,合法类型系统默认
     * @param fileName
     *      文件名
     * @return
     */
    public static void checkUploadFile(String fileName) {
        if (!checkUploadRightTypes(fileName)) {
            throw new EToolsRuntimeException("上传文件格式有误");
        }
    }

    /**
     * 校验上传文件名是否合法,合法类型自定义
     * @param fileName
     *      文件名
     * @return
     */
    public static void checkUploadFile(String fileName, String... rightTypes) {
        if (!checkRightTypes(fileName, rightTypes)) {
            throw new EToolsRuntimeException("上传文件格式有误");
        }
    }

    /**
     * 校验下载文件路径是否合法,合法类型系统默认
     * @param path
     *      文件路径
     * @return
     */
    public static boolean checkDownloadRightTypes(String path) {
        return checkRightTypes(path, downloadRightTypes) && !path.contains("..");
    }

    /**
     * 校验下载文件路径是否合法,合法类型系统默认
     * @param path
     *      文件路径
     * @return
     */
    public static void checkDownloadFile(String path) {
        checkDownloadFile(path, downloadRightTypes);
    }

    /**
     * 校验下载文件路径是否合法,合法类型自定义
     * @param path
     *      文件路径
     * @return
     */
    public static void checkDownloadFile(String path, String... rightTypes) {
        if (!checkRightTypes(path, rightTypes) || path.contains("..")) {
            throw new EToolsRuntimeException("路径格式错误");
        }
    }

    /**
     * 校验上传文件名是否合法
     * @param fileName
     *      文件名
     * @param rightTypes
     *      合法类型
     * @return
     */
    public static boolean checkRightTypes(String fileName, String... rightTypes) {
        if (fileName.contains("../")) {
            return false;
        }
        if (rightTypes.length == 1 && "*".equals(rightTypes[0])) {
            return true;
        }
        int index = fileName.lastIndexOf('.');
        if (index < 0) {
            return false;
        }
        return ArrayUtil.indexOfIgnoreCase(rightTypes, fileName.substring(index+1)) > -1;
    }

}
